/*
 * Escenario.h
 *
 *  Created on: 30/03/2013
 *      Author: Juliansci
 */

#ifndef ESCENARIO_H_
#define ESCENARIO_H_

#include "Casilla.h"
#include "Personaje.h"
#include "EnemigoAutomata.h"
#include <list>
#include "bonus/Bonus.h"

using namespace std;
class Personaje;
class Casilla;
class Escenario {
public:
	Escenario(int ancho,int alto);
	void agregarPersonaje(Personaje* persona);
	void agregarProtagonista(Personaje* protagonista);
	void agregarEntidad(Entidad* entidad);
	Casilla* getCasilla(int x,int y);
	void setEntidadesenCasillas(Entidad, int x, int y);
	void setEntidadesCompuestasEnCasillas(list<Entidad*> lista);

	void setPersonajesOProtagonistasenCasillas(list<Personaje*>);

	void setCasilla(int x,int y, Casilla* casilla);
	pair<int,int> tileWalk(string direccion, pair<int,int> posicion, int pasos);
	pair<int,int> mapeoMovimientoPersonaje(string direccion, pair<int,int> posicion, int pasos);
	virtual ~Escenario();
	Casilla*** getCasillas();
	int getAlto() const;
	int aproximarVelocidad(int);
	void setAlto(int);
	int getAncho() const;
	void setAncho(int);
	string& getNombre();
	void setNombre(string);
	const list<Personaje*>& getPersonajes() const;
	void setPersonajes(list<Personaje*>);
	const list<Personaje*>& getProtagonistas() const;
	Personaje* getProtagonista(string);
	void setProtagonistas(list<Personaje*>);
	bool cambiarCasillaPersonaje();
	void calcularCaminoPersonaje(Casilla*,Casilla*);
	bool actualizarPosicionPersonaje();
	void avanzarAnimaciones(int tiempoActual);
	 list<Entidad*> getEntidades();
	void setEntidades( list<Entidad*> entidades);
	void inicializarNiebla(string nombreUsu);
	void terminarCaminoProtagonista();
	void removerProtagonista(Personaje* personaje);
	void crearAutomatas(list<Personaje*> personajesAutomatas, pair<int,int> coordJefe);
	Personaje* getPersonaje(string usuario);
	list<EnemigoAutomata*>& getEnemigosAutomatas();
	void comenzarAutomatas();
	void updateEstadoAutomatas();
	void updateEstadoAutomatasSingle();
	void updateAtacarAutomatas();
	void updateVidaAutomatas();

	bool casillasSonVecinas(Casilla* casilla1, Casilla* casilla2, int pasosVision);
	void desbloquearCasillasAdyacentes(Casilla* unaCasilla, int pasosVision);

	Casilla* getCasillaRandomLibre();
	Entidad* obtenerEntidadPorId(int id);

	void agregarBonus(Bonus* bonus);
	void removerBonus(Bonus* bonus);
	void removerEntidad(Entidad* entidad);

	void agregarAutomata(EnemigoAutomata* enemigoAutomata);
	void removerAutomata(EnemigoAutomata* enemigoAutomata);


	void setTiposEntidades(map<string,TipoEntidad*> tipos);
	map<string,TipoEntidad*> getTiposEntidades();


	list<Bonus*> getListaBonus();
	int ancho;
	int alto;

private:

	string nombre;
	Casilla*** casillas;
	list<Entidad*> entidades;
	list<Personaje*> personajes;
	list<Personaje*> protagonistas;

	map<string,TipoEntidad*> tiposDeEntidades;
	//list<EnemigoAutomata*> enemigosAutomatas;
	list<Bonus*> listaBonus;
	list<EnemigoAutomata*> enemigosAutomatas;

};

#endif /* ESCENARIO_H_ */
